package bean;

import java.util.ArrayList;
import java.util.List;

import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;
import javax.faces.component.UISelectItem;
import javax.faces.component.html.HtmlInputText;

import mensagem.MsgProduto;
import session.SessionGrupo;
import session.SessionProduto;
import entity.Grupo;
import entity.Produto;

@ManagedBean
@SessionScoped
public class BeanProduto {

	private Produto produto = new Produto();

	private Produto filtro = new Produto();

	private List<Produto> produtos = new ArrayList<Produto>();

	private SessionProduto session = new SessionProduto();

	private SessionGrupo sessionG = new SessionGrupo();

	private HtmlInputText grupo;

	private UISelectItem selectInsumo;

	private UISelectItem selectIntermediario;

	private UISelectItem selectFinal;

	private UISelectItem selectProduzido;

	private boolean compra = false;

	private boolean venda = false;

	private boolean insumo = false;

	private boolean produzido = false;

	@SuppressWarnings("unused")
	private int tipo = 0;

	// //////////////////////////CONSTRUCTOR//////////////////////////////////////
	// ///////////////////////////////////////////////////////////////////////////

	public BeanProduto() {

	}

	// //////////////////////////CONSTRUCTOR//////////////////////////////////////
	// ///////////////////////////////////////////////////////////////////////////

	public Produto getProduto() {
		return produto;
	}

	public void setTipo(int tipo) {
		this.tipo = tipo;
	}

	public UISelectItem getSelectInsumo() {
		return selectInsumo;
	}

	public void setSelectInsumo(UISelectItem selectInsumo) {
		this.selectInsumo = selectInsumo;
	}

	public UISelectItem getSelectIntermediario() {
		return selectIntermediario;
	}

	public void setSelectIntermediario(UISelectItem selectIntermediario) {
		this.selectIntermediario = selectIntermediario;
	}

	public UISelectItem getSelectFinal() {
		return selectFinal;
	}

	public void setSelectFinal(UISelectItem selectFinal) {
		this.selectFinal = selectFinal;
	}

	public UISelectItem getSelectProduzido() {
		return selectProduzido;
	}

	public void setSelectProduzido(UISelectItem selectProduzido) {
		this.selectProduzido = selectProduzido;
	}

	public boolean isCompra() {
		return compra;
	}

	public void setCompra(boolean compra) {
		this.compra = compra;
		if (compra) {
			this.setInsumo(false);
			this.setVenda(false);
			this.setProduzido(false);
			this.setProdutos(new ArrayList<Produto>());
		}

	}

	public boolean isVenda() {
		return venda;
	}

	public boolean isProduzido() {
		return produzido;
	}

	public void setProduzido(boolean produzido) {
		this.produzido = produzido;
		if (produzido) {
			this.setCompra(false);
			this.setInsumo(false);
			this.setVenda(false);
			this.setProdutos(new ArrayList<Produto>());
		}

	}

	public void setVenda(boolean venda) {
		this.venda = venda;
		if (venda) {
			this.setCompra(false);
			this.setInsumo(false);
			this.setProduzido(false);
			this.setProdutos(new ArrayList<Produto>());
		}

	}

	public boolean isInsumo() {
		return insumo;
	}

	public void setInsumo(boolean insumo) {
		this.insumo = insumo;
		if (insumo) {
			this.setCompra(false);
			this.setVenda(false);
			this.setProduzido(false);
			this.setProdutos(new ArrayList<Produto>());
		}

	}

	public void setProduto(Produto produto) {
		this.produto = produto;
	}

	public Produto getFiltro() {
		return filtro;
	}

	public void setFiltro(Produto filtro) {
		this.filtro = filtro;
	}

	public List<Produto> getProdutos() {
		return produtos;
	}

	public void setProdutos(List<Produto> produtos) {
		this.produtos = produtos;
	}

	public SessionProduto getSession() {
		return session;
	}

	public void setSession(SessionProduto session) {
		this.session = session;
	}

	public SessionGrupo getSessionG() {
		return sessionG;
	}

	public void setSessionG(SessionGrupo sessionG) {
		this.sessionG = sessionG;
	}

	public HtmlInputText getGrupo() {
		return grupo;
	}

	public void setGrupo(HtmlInputText grupo) {
		this.grupo = grupo;
	}

	// ///////////////////////////////METODOS/////////////////////////////////////
	// ///////////////////////////////////////////////////////////////////////////
	// ///////////////////////////////////////////////////////////////////////////

	public void reinit() {
		this.setProduto(new Produto());
		this.setFiltro(new Produto());
		this.grupo.setValue("");
		this.setProdutos(new ArrayList<Produto>());
	}

	public String save() throws Exception {
		if (this.produto.getId() != null) {
			return this.update();
		} else {
			if (this.session.save(this.produto)) {
				this.reinit();
				MsgProduto.msgSave();
			}
		}
		return "";
	}

	public String update() throws Exception {
		if (this.session.update(this.produto)) {
			this.reinit();
			MsgProduto.msgUpdate();
		}
		return null;
	}

	public String remove() {
		try {
			this.session.remove(produto);
			MsgProduto.msgRemove();
		} catch (Exception e) {
			MsgProduto.msgNotRemove();
		}
		return null;
	}

	public void find() throws Exception {
		this.produtos = this.session.getController().findList(filtro);
		if (compra) {
			// somente Insumo Final talvez Intermediario
			for (int i = 0; i < produtos.size(); i++) {
				if ((!produtos.get(i).getTipoProduto().equals("Insumo"))
						&& (!produtos.get(i).getTipoProduto().equals("Final"))) {
					produtos.remove(i);
					i = -1;
				}
			}
		}
		if (insumo) {
			// somente Insumo ou intermediario
			for (int i = 0; i < produtos.size(); i++) {
				if ((!produtos.get(i).getTipoProduto().equals("Insumo"))
						&& (!produtos.get(i).getTipoProduto()
								.equals("Intermediario"))) {
					produtos.remove(i);
					i = -1;
				}

			}
		}
		if (venda) {
			// somente produzido ou final
			for (int i = 0; i < produtos.size(); i++) {
				if ((!produtos.get(i).getTipoProduto().equals("Produzido"))
						&& (!produtos.get(i).getTipoProduto().equals("Final"))) {
					produtos.remove(i);
					i = -1;
				}

			}
		}
		if (produzido) {
			// produto somente produzido
			for (int i = 0; i < produtos.size(); i++) {
				if (!produtos.get(i).getTipoProduto().equals("Produzido")) {
					produtos.remove(i);
					i = -1;
				}

			}
		}
		this.filtro = new Produto();
	}

	public void findInsumo() throws Exception {
		if ((this.filtro != null) && (this.filtro.getDescricao() != null)
				&& (this.filtro.getId() != null)) {
			this.produtos = this.session.getController().findList(filtro);
		} else {
			this.produtos = this.session.getController().getListByHQLCondition(
					"from Produto where tipoproduto = 'Insumo'");
			List<Produto> aux = this.session.getController()
					.getListByHQLCondition(
							"from Produto where tipoproduto = 'Intermediario'");
			this.produtos.addAll(aux);
		}
		this.filtro = new Produto();
	}

	public String hotFindGrupo() {
		if (this.produto.getGrupo() != null) {
			if ((this.produto.getGrupo().getId() != null)
					&& (this.produto.getGrupo().getDescricao() != null)) {
				int aux = this.produto.getGrupo().getId();
				this.produto.setGrupo(new Grupo());
				this.produto.getGrupo().setId(aux);
			}
		}

		if ((this.produto.getGrupo() != null)
				&& (this.produto.getGrupo().getId() != null)) {
			try {
				this.produto.setGrupo(this.sessionG.getController().find(
						this.produto.getGrupo()));
			} catch (Exception e) {
				this.produto.setGrupo(new Grupo());
			}
			if ((this.produto.getGrupo() != null)
					&& (produto.getGrupo().getDescricao() != null)) {
				this.grupo.setValue(produto.getGrupo().getDescricao());
				return null;
			}
		}
		this.produto.setGrupo(new Grupo());
		return null;
	}

	public int getTipo() {
		if (compra) {
			// somente Insumo Final talvez Intermediario
			this.selectIntermediario.setItemDisabled(true);
			this.selectProduzido.setItemDisabled(true);
			this.selectFinal.setItemDisabled(false);
			this.selectInsumo.setItemDisabled(false);
		}
		if (insumo) {
			// somente Insumo ou intermediario
			this.selectFinal.setItemDisabled(true);
			this.selectProduzido.setItemDisabled(true);
			this.selectIntermediario.setItemDisabled(false);
			this.selectInsumo.setItemDisabled(false);
		}
		if (venda) {
			// somente produzido ou final
			this.selectIntermediario.setItemDisabled(true);
			this.selectInsumo.setItemDisabled(true);
			this.selectFinal.setItemDisabled(false);
			this.selectProduzido.setItemDisabled(false);
		}
		if (produzido) {
			// produto somente produzido
			this.selectIntermediario.setItemDisabled(true);
			this.selectInsumo.setItemDisabled(true);
			this.selectFinal.setItemDisabled(true);
			this.selectProduzido.setItemDisabled(false);
		}
		return 0;
	}

}
